let unit={
    try_catch : function (fn,str,flag) {
        try{
            fn();
        }catch(err){
            str===undefined?console.log(err):console.log(err+'  '+str);
            if(flag!==undefined){debugger}
        }
    },
    setTimeout:function (fn,time) {
        /*
        * 延时执行函数
        * fn是要延时的函数,time是多久后执行,单位是毫秒
        * */
        setTimeout(fn,time);
    },
    dataGeneration:function (str,sign) {
        /*
        * 数据生成函数,主要用于codeDisplay组件
        * 负责将字符串按照期望的符号分割
        * str:要分割的字符串
        * sign:期望的分割符号
        * */
        return str.split(sign);
    },
    getRidOfPX:function (str) {
        /*
        * 用于去掉样式的px单位
        * */
        return str.substr(0,str.length-2);
    },
    observer:(function () {
        let queue = [];
        let requestAnimationFrame = window.requestAnimationFrame || window.mozRequestAnimationFrame ||
            window.webkitRequestAnimationFrame || window.msRequestAnimationFrame;

        /*
        * 将要执行的函数添加进队列中,随后在step函数中执行
        * name:标识,fn:执行的函数
        * */
        let add = function (name,fn) {
            let temp = {
                name:name,
                fn:fn
            };
            queue.push(temp);
        };

        //name:要移除函数的标识
        let remove = function (name) {
            if(queue.length===1&&queue[0].name===name){
                queue.pop();
                return 'remove is done.';
            }

            for(let i=0;i<queue.length;i++){
                if(queue[i].name===name){
                    queue[i] = queue.pop();
                    return 'remove is done.';
                }
            }
        };

        let counter = 0;
        let requestID = null;
        let step = function () {
            //step是requestAnimationFrame的回调函数
            //运行500毫秒
            if(counter>=30){
                counter = 0;
                return 0;
            }
            if(queue.length>=1){
                for(let i=0;i<queue.length;i++){
                    queue[i].fn();
                }
            }else{
                console.log('queue is empty.');
                return 0;
            }
            // console.log('done');
            counter++;
            requestAnimationFrame(step);
        };

        let update = function () {
            requestID = requestAnimationFrame(step);
        };

        window.addEventListener('resize',update);

        let getFn = function (name,run) {
            /*
            * 用于获取已放入queue中的函数
            * name:要获取的函数标识符
            * run:
                * true:立即执行
                * false||undefined:返回函数
            * */
            let arr = [];
            let error = true;
            for(let i=0;i<queue.length;i++){
                if(queue[i].name===name&&run){
                    unit.setTimeout(queue[i].fn,100);
                    error = false;
                    //之前这里是有个return
                    //但是在复用一个组件时,queue中就会有多个同名对象
                    //如果这里有return,那么就只会获得一个对象
                    //但在我的代码里,目前为止需要运用这个函数的全是响应式样式代码
                    //所以如果有同名的对象,那么必定是全部执行,而不是只执行一个
                }else if(queue[i].name===name){
                    arr.push(queue[i].fn);
                    error = false;
                }
            }
            if(arr.length!==0){
                return arr;
            }
            if(error){
                console.log('without '+name+' in queue');
                return 0;
            }
        };

        return {
            add:add,
            remove:remove,
            getFn:getFn
        }
    })(),
    addStylePX:function (obj1,obj2) {
        /*
        * addStyle的px版本
        * 将经过transition转化好的数据赋值到样式中
        * obj1:转好数据的对象
        * obj2:要赋值数据的样式对象
        * 先将obj1中的数据给obj2,然后obj2在进行单位转换
        * 这样可以避免obj1中的数据被破坏
        * */
        let check = function (name) {
            return name==='left'||name==='width'||name==='top'||name==='height';
        };
        for(let name in obj1){
            if(check(name)){
                obj2[name] = obj1[name]+'px';
            }
        }
        return obj2;
    }
};
